name: Psalm

on:
  pull_request: ~

defaults:
  run:
    shell: bash

concurrency:
    group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
    cancel-in-progress: true

permissions:
  contents: read

jobs:
  psalm:
    name: Psalm
    runs-on: Ubuntu-20.04

    env:
      php-version: '8.2'
    steps:
      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: ${{ env.php-version }}
          ini-values: "memory_limit=-1"
          coverage: none

      - name: Checkout target branch
        uses: actions/checkout@v4
        with:
          ref: ${{ github.base_ref }}

      - name: Checkout PR
        uses: actions/checkout@v4

      - name: Install dependencies
        run: |
          COMPOSER_HOME="$(composer config home)"
          ([ -d "$COMPOSER_HOME" ] || mkdir "$COMPOSER_HOME") && cp .github/composer-config.json "$COMPOSER_HOME/config.json"
          export COMPOSER_ROOT_VERSION=$(grep ' VERSION = ' src/Symfony/Component/HttpKernel/Kernel.php | grep -P -o '[0-9]+\.[0-9]+').x-dev
          composer remove --dev --no-update --no-interaction symfony/phpunit-bridge
          composer require --no-progress --ansi --no-plugins psalm/phar:@stable phpunit/phpunit:^9.6 php-http/discovery psr/event-dispatcher mongodb/mongodb jetbrains/phpstorm-stubs

      - name: Generate Psalm baseline
        run: |
          git checkout composer.json
          git checkout -m ${{ github.base_ref }}

          # @todo intersection types are broken in Psalm
          # @see https://github.com/vimeo/psalm/issues/7520
          sed -i 's/Uuid&/Uuid|/' src/Symfony/Component/Uid/Factory/TimeBasedUuidFactory.php
          sed -i 's/Interface&/Interface|/' src/Symfony/Component/HttpFoundation/Session/Storage/Handler/MigratingSessionHandler.php
          ./vendor/bin/psalm.phar --set-baseline=.github/psalm/psalm.baseline.xml --no-progress
          git checkout -m FETCH_HEAD

      - name: Psalm
        run: |
          ./vendor/bin/psalm.phar --no-progress || ./vendor/bin/psalm.phar --output-format=github --no-progress
